@@ -94,9 +94,8 @@ module Utils |
||
| 94 | 94 |
def <=> other |
| 95 | 95 |
other = other.array |
| 96 | 96 |
@array.each_with_index do |e, i| |
| 97 |
- case cmp = e <=> other[i] |
|
| 98 |
- when nil |
|
| 99 |
- return nil |
|
| 97 |
+ o = other[i] |
|
| 98 |
+ case cmp = e <=> o || e.to_s <=> o.to_s |
|
| 100 | 99 |
when 0 |
| 101 | 100 |
next |
| 102 | 101 |
else |
@@ -153,5 +153,23 @@ describe Utils do |
||
| 153 | 153 |
Utils.sort_tuples!(tuples, orders) |
| 154 | 154 |
expect(tuples).to eq expected |
| 155 | 155 |
end |
| 156 |
+ |
|
| 157 |
+ it "always succeeds in sorting even if it finds pairs of incomparable objects" do |
|
| 158 |
+ time = Time.now |
|
| 159 |
+ tuples = [ |
|
| 160 |
+ [2, "a", time - 1], # 0 |
|
| 161 |
+ [1, "b", nil], # 1 |
|
| 162 |
+ [1, "b", time], # 2 |
|
| 163 |
+ ["2", nil, time], # 3 |
|
| 164 |
+ [1, nil, time], # 4 |
|
| 165 |
+ [nil, "a", time + 1], # 5 |
|
| 166 |
+ [2, "a", time], # 6 |
|
| 167 |
+ ] |
|
| 168 |
+ orders = [true, false, true] |
|
| 169 |
+ expected = tuples.values_at(3, 6, 0, 4, 2, 1, 5) |
|
| 170 |
+ |
|
| 171 |
+ Utils.sort_tuples!(tuples, orders) |
|
| 172 |
+ expect(tuples).to eq expected |
|
| 173 |
+ end |
|
| 156 | 174 |
end |
| 157 | 175 |
end |